package gestores;

import java.sql.Date;
import java.sql.ResultSet;
import java.util.Vector;


import entidades.Animal;
import entidades.Campo;
import entidades.Caravana;
import entidades.Categoria;
import entidades.Especie;
import entidades.Estado;
import entidades.Pesaje;
import entidades.Potrero;
import entidades.Raza;

public class GestorAnimal {
	private Animal animalActual;
	private AdministradorBD adminBD= new AdministradorBD();
	private static GestorAnimal gAnimal;
	
	   static public GestorAnimal getGestorAnimal() {

	        if (gAnimal == null) {
	            gAnimal = new GestorAnimal();
	        }
	        return gAnimal;
	    }

	
	
	public void darAltaAnimal(Raza raza,Categoria categoria,Vector<String> caravanas, Potrero potrero, 
			String aspecto,Integer madre,Integer padre,String nombre,java.util.Date fecha,String fileName) throws Throwable{
			
			for(int i=0;i<caravanas.size();i++){
				Animal nuevo= new Animal();
				nuevo.setRaza(raza);
				nuevo.setCategoria(categoria);
				nuevo.setPotreroActual(potrero);
				if(aspecto!=null)nuevo.setAspecto(aspecto);
				if(madre!=null) nuevo.setIdMadre(madre);
				if(padre!=null) nuevo.setIdPadre(padre);
				
				try {
					int idAnimal=adminBD.registrarAnimal(raza.getId(), categoria.getId(), caravanas.get(i), potrero.getIdPotrero(),potrero.getCampoPerteneciente().getIdCampo(), aspecto, nombre, madre, padre,fecha,1,fileName);
					Caravana nuevaCaravana= new Caravana(0,caravanas.get(i),idAnimal,false,fecha);
					nuevo.setCaravanaActual(nuevaCaravana);

					
				} catch (Throwable e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					throw(e);
				}
			}
			
			
		
	}

	
	public Vector<Animal> getListadeAnimales( String especie,String raza, String sexo, String categoria, String campo, String potrero) throws Throwable {
		
		Vector<Animal> animales= new Vector<Animal>();
		ResultSet rs=adminBD.getListadeAnimales(especie,raza,sexo,categoria,campo,potrero);
		try {
			if(rs.next()){
				do{
					Animal a= new Animal();
					a.setIdAnimal(rs.getInt("idAnimal"));
					Especie e=new Especie(rs.getInt("e.idEspecie"),rs.getString("e.nombreEspecie"));
					Raza r= new Raza(rs.getInt("idRaza"), rs.getString("nombreEspecie"), rs.getString("raza"));
					Categoria c= new Categoria(rs.getInt("idCategoria"),rs.getString("nombreEspecie") , rs.getString("sexo"), rs.getString("categoria"));
					Caravana car= new Caravana(rs.getInt("idCaravana"), rs.getString("caravana"), rs.getInt("idAnimal"), rs.getBoolean("final"),(java.util.Date) rs.getObject("fecha"));
					Potrero p= new Potrero(rs.getInt("idPotrero"),rs.getString("nombrePotrero"));
					Campo camp= new Campo(rs.getInt("idCampo"),rs.getString("v.nombreCampo"));
					p.setCampoPerteneciente(camp);
					a.setEspecie(e);
					a.setRaza(r);
					a.setCategoria(c);
					a.setCaravanaActual(car);
					a.setPotreroActual(p);
					a.setCastrado(rs.getBoolean("a.castrado"));
					a.setDescornado(rs.getBoolean("a.descornado"));
					a.setPesoActual((Integer) rs.getObject("peso.valorPeso"));
					animales.add(a);
				}while(rs.next());
			}
		} catch (Throwable e) {
			e.printStackTrace();
			Throwable t= new Throwable("La consulta no se pudo realizar. Intente luego.");
			throw(t);
		}
		
		
		return animales;
	}
	
	/*public void eliminarAnimal(int idAnimal) throws Throwable{
		adminBD.eliminarAnimal(idAnimal);
	}
*/


	public Animal getAnimalActual() {
		return animalActual;
	}



	public void setAnimalActual(Animal animalActual) {
		this.animalActual = animalActual;
	}
	

	public void registrarPesaje(int valor,java.util.Date fecha) throws Throwable{
			
		adminBD.registrarPesaje(gAnimal.getAnimalActual().getIdAnimal(), valor, fecha);
		
		
	}
	
	public void descornarAnimal() throws Throwable{
		adminBD.descornarAnimal(gAnimal.getAnimalActual().getIdAnimal());
	}
	
	public void castrarAnimal() throws Throwable{
		adminBD.castrarAnimal(gAnimal.getAnimalActual().getIdAnimal());
	}

	public Vector<Pesaje> getListadePesajes() throws Throwable {
		
		Vector<Pesaje> pesos= new Vector<Pesaje>();
		ResultSet rs=adminBD.getListadePesajes(gAnimal.getAnimalActual().getIdAnimal());
		try {
			if(rs.next()){
				do{
					
					Pesaje p=new Pesaje(rs.getInt("idAnimal"), rs.getInt("idPesaje"), rs.getInt("valorPeso"), (java.util.Date) rs.getObject("fecha"));
					pesos.add(p);
				}while(rs.next());
			}
		} catch (Throwable e) {
			//TODO
			e.printStackTrace();
			Throwable t= new Throwable("La consulta no se pudo realizar. Intente luego.");
			throw(t);
		}
		
		
		return pesos;
	}



	public void registrarTraslado(int idCampo, int idPotrero,Vector<Integer> vectorIds,java.util.Date fecha) throws Throwable {
		int i=0;
		while(i<vectorIds.size()){
			adminBD.registrarTraslado(idCampo,idPotrero,vectorIds.get(i),fecha);
			i++;
		}
		
	}



	public int registrarCaravana(String caravana, java.util.Date fecha) throws Throwable {
		
		return adminBD.registrarCaravana(caravana,fecha,getAnimalActual().getIdAnimal());		
	}



	public Vector<Caravana> getListadeCaravanas() throws Throwable {
		
		Vector<Caravana> caravanas= new Vector<Caravana>();
		ResultSet rs=adminBD.getListadeCaravanas(gAnimal.getAnimalActual().getIdAnimal());
		try {
			if(rs.next()){
				do{
					Caravana c=new Caravana(rs.getInt("idCaravana"),(String) rs.getObject("caravana"), rs.getInt("idAnimal"), rs.getBoolean("final"), (java.util.Date) rs.getObject("fecha"));
					caravanas.add(c);
				}while(rs.next());
			}
		} catch (Throwable e) {
			//TODO
			e.printStackTrace();
			Throwable t= new Throwable("La consulta no se pudo realizar. Intente luego.");
			throw(t);
		}
		
		
		return caravanas;
	}
	
	private Animal getFichaCompletaAnimal() throws Throwable {
		
		
		ResultSet rs=adminBD.getFichaCompletaAnimal(gAnimal.getAnimalActual().getIdAnimal());
		try {
			if(rs.next()){
				do{
					getAnimalActual().setCastrado(rs.getBoolean("castrado"));
					getAnimalActual().setDescornado(rs.getBoolean("descornado"));
					getAnimalActual().setPesoActual((Integer) rs.getObject("peso"));
					
				}while(rs.next());
			}
		} catch (Throwable e) {
			//TODO
			e.printStackTrace();
			Throwable t= new Throwable("La consulta no se pudo realizar. Intente luego.");
			throw(t);
		}
		
		
		return getAnimalActual();
	}



	public void setCaravanaFinal(int idCaravana) throws Throwable {
			
		
		adminBD.setCaravanaFinal(idCaravana);
		
		
	}
	
	public Vector<Estado> getEstados() throws Throwable {
		
		Vector<Estado> estados=new Vector<Estado>();
		ResultSet rs=adminBD.getEstados();
		try {
			if(rs.next()){
				do{
					Estado e=new Estado(rs.getInt("idEstado"), rs.getString("nombreEstado"));
					estados.add(e);
				}while(rs.next());
			}
		} catch (Throwable e) {
			//TODO
			e.printStackTrace();
			Throwable t= new Throwable("La consulta no se pudo realizar. Intente luego.");
			throw(t);
		}
		
		
		return estados;
	}



	public void setEstado(int idAnimal, int idEstado) throws Throwable {
		adminBD.setEstado(idAnimal,idEstado);
		
	}

	
	

	
	
}
